'use strict';
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
const bootstrap = () => __awaiter(void 0, void 0, void 0, function* () {
    const path = require('path');
    const fs = require('fs-extra');
    // Do this as the first thing so that any code reading it knows the right env.
    process.env.BABEL_ENV = 'test';
    process.env.NODE_ENV = 'test';
    process.env.PUBLIC_URL = '';
    // Ensure environment variables are read.
    require('../config/env');
    const paths = require('../config/paths');
    const compileEnvFile = path.resolve(paths.appConfig, 'compileTestEnv.js');
    if (fs.existsSync(compileEnvFile)) {
        Object.assign(process.env, require(compileEnvFile));
    }
    // Makes the script crash on unhandled rejections instead of silently
    // ignoring them. In the future, promise rejections that are not handled will
    // terminate the Node.js process with a non-zero exit code.
    process.on('unhandledRejection', (err) => {
        throw err;
    });
    const jest = require('jest');
    const execSync = require('child_process').execSync;
    let argv = process.argv.slice(2);
    function isInGitRepository() {
        try {
            execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' });
            return true;
        }
        catch (e) {
            return false;
        }
    }
    function isInMercurialRepository() {
        try {
            execSync('hg --cwd . root', { stdio: 'ignore' });
            return true;
        }
        catch (e) {
            return false;
        }
    }
    // Watch unless on CI, in coverage mode, explicitly adding `--no-watch`,
    // or explicitly running all tests
    if (!process.env.CI &&
        argv.indexOf('--coverage') === -1 &&
        argv.indexOf('--no-watch') === -1 &&
        argv.indexOf('--watchAll') === -1) {
        // https://github.com/facebook/create-react-app/issues/5210
        const hasSourceControl = isInGitRepository() || isInMercurialRepository();
        argv.push(hasSourceControl ? '--watch' : '--watchAll');
    }
    // Jest doesn't have this option so we'll remove it
    if (argv.indexOf('--no-watch') !== -1) {
        argv = argv.filter((arg) => arg !== '--no-watch');
    }
    return jest.run(argv);
});
exports.default = bootstrap;
